//创建发布者节点

#include <iostream>//C++编程标准库   不影响ros2系统 自己加的
using namespace std;



#include <chrono>
#include <functional>
#include <memory>
#include <string>

#include "rclcpp/rclcpp.hpp"//使用C++编写    都要引入此头文件
#include "std_msgs/msg/string.hpp"//字符串信息的头文件

using namespace std::chrono_literals;//声明std::chrono_literals命名空间

/* This example creates a subclass of Node and uses std::bind() to register a
 * member function as a callback from the timer. */

class MinimalPublisher : public rclcpp::Node   //过继承rclcpp::Node节点基类创建节点类MinimalPublisher。代码中的每个this都引用节点。       主函数调用过一次
{
  public:
    MinimalPublisher()
    : Node("minimal_publisher"), count_(0)//MinimalPublisherd的构造函数，将count_变量初始化为0，节点名初始化为“minimal_publisher”
    {

     
       
    
      publisher_ = this->create_publisher<std_msgs::msg::String>("topic", 10);//构造函数内先是创建了一个发布者，发布的话题名是topic，话题消息是String，保存消息的队列长度是10
      timer_ = this->create_wall_timer(500ms, std::bind(&MinimalPublisher::timer_callback, this));//创建一个定时器timer_，做了一个500ms的定时，每次触发定时器后，都会运行回调函数timer_callback
      //定时器开始后就一直执行 （不确定）   

      
      

      
     
    

    }

  private:
    void timer_callback()            //回调函数
    {
      
      auto message = std_msgs::msg::String();//初始化    消息类型为字符串型        关键字auto在C++里面代表自动判断变量类型
      message.data = "Hello, world! " + std::to_string(count_++);//填充消息   信息为 
      
      RCLCPP_INFO(this->get_logger(), "Publishing: '%s'", message.data.c_str());//RCLCPP_INFO宏函数打印一次日志信息，Publishing:+要发布的消息
      publisher_->publish(message);//发布者发布消息   通过发布者的publish方法将消息发布出去。
    }
    //计时器、发布者和计数器字段的声明。
    rclcpp::TimerBase::SharedPtr timer_;
    rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;
    size_t count_;
  };

//创建主函数

  int main(int argc, char * argv[])
  {
    rclcpp::init(argc, argv);//初始化ros2节点

   int a;
    cin >>a;
    cout << a<<endl;
    cout <<"这里是发布者"<<endl;

    rclcpp::spin(std::make_shared<MinimalPublisher>());//使用rclcpp::spin创建MinimalPublisher      在主函数运行MinimalPublish  类

    

    rclcpp::shutdown();//进入自旋锁，当退出锁时，就会关闭节点结束了   终端   Ctrl+c  退出该节点
    return 0;
  }
